package org.footballmanager.pandafootball.system.service.impl;

import org.footballmanager.pandafootball.common.BaseDao;
import org.footballmanager.pandafootball.common.annotation.SystemServiceLog;
import org.footballmanager.pandafootball.common.constants.Constants;
import org.footballmanager.pandafootball.system.domain.BsccAndJfEntity;
import org.footballmanager.pandafootball.system.domain.FootBfinfo;
import org.footballmanager.pandafootball.system.service.FootZjService;
import org.footballmanager.pandafootball.system.service.RepeatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 服务抽象类
 * 用于抽象出一些已知的服务，如根据主键获取唯一记录、保存记录等方法
 * 继承此类可以省去 大部分重复代码
 *
 * @author chenjian
 * @since 2017年9月27日上午10:57:28
 */
public abstract class RepeatMainServiceImpl<T extends BsccAndJfEntity> extends ServiceImpl<T> implements RepeatService<T>{
	@Autowired
	BaseDao<T> baseDao;
	@Autowired
	private FootZjService footZjService;

	/**
	 * 保存记录
	 * @param entity 参数
     *@param request 参数  @return 返回值
	 */
	@Override
	@Transactional
	@SystemServiceLog(description = "保存记录")
	public int save(T entity, HttpServletRequest request){
		/*根据胜平负球数算出:
		场次（带过来） = 报分次数
		胜平负相加 （带过来） = 场次
		进球（带过来）=所有报分里这个球队进球累加
		失球（带过来）=所有报分里这个球队失球累加
		净胜球 = 进球-失球
		胜率 = 胜 ÷ 场次
		积分 = 胜*3 + 平*1 + 负*0  */
		entity.setJf(entity.getS() * 3 + entity.getP());
	    if(request != null){
            entity.setCreateId((Long)request.getSession().getAttribute(Constants.USERID));
            entity.setUpdateId((Long)request.getSession().getAttribute(Constants.USERID));
        }
		entity.setCreateTime(new Date());
		entity.setUpdateTime(new Date());
		return baseDao.insert(entity);
	}

    @Override
    @Transactional
    public int updateNotNull(T entity, HttpServletRequest request) {
        entity.setJf(entity.getS() * 3 + entity.getP());
        entity.setUpdateId((Long)request.getSession().getAttribute(Constants.USERID));
        entity.setUpdateTime(new Date());
        this.reComputeRanking(request);
        return baseDao.updateByPrimaryKeySelective(entity);
    }

    /**
     * 重新计算排名
     *
     * @param request 请求
     */
    @SystemServiceLog(description = "重新计算排名")
    public abstract void reComputeRanking(HttpServletRequest request);

	/**
	 * 根据用户主键获取记录
	 *
	 * @param userId 用户主键
	 * @return 记录
	 */
	@Override
	@SystemServiceLog(description = "根据用户主键获取记录")
	public abstract T findByUserid(Long userId);

	/**
	 * 报分确认后更新数据
	 *
	 * @param bf
	 * @param request
	 */
	@Override
	@SystemServiceLog(description = "报分确认后更新数据")
	public void addEncourage(FootBfinfo bf, HttpServletRequest request) {
		T zhufc = this.findByUserid(bf.getQd1());
		T kefc = this.findByUserid(bf.getQd2());
		processAdd(zhufc, kefc, bf, request);
		this.updateNotNull(zhufc, request);
		this.updateNotNull(kefc, request);
	}

	/**
	 * 处理报分后续功能加分
	 * @param zhufc 主场球队
	 * @param kefc 客场球队
	 * @param bf 报分实体
	 * @param request 请求
	 */
	@Override
	@SystemServiceLog(description = "处理报分后续功能加分")
	public void processAdd(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
		//俱乐部排行数据更新
		if(zhufc != null && kefc != null){
			zhufc.setBscc(zhufc.getBscc() + 1);
			kefc.setBscc(kefc.getBscc() + 1);

			if(bf.getJq1() > bf.getJq2()){
				//2代表主队胜利,1代表平,0代表主队负
				zhufc.setJf(zhufc.getJf() + 3);
				zhufc.setS(zhufc.getS() + 1);
				kefc.setF(kefc.getF() + 1);
				footZjService.getMoney(bf.getQd1(), bf.getQd2(), 2, true, bf.getBflx(), request);
			}else if(bf.getJq1().equals(bf.getJq2())){
				zhufc.setJf(zhufc.getJf() + 1);
				zhufc.setP(zhufc.getP() + 1);
				kefc.setJf(kefc.getJf() + 1);
				kefc.setP(kefc.getP() + 1);
				footZjService.getMoney(bf.getQd1(), bf.getQd2(), 1, true, bf.getBflx(), request);
			}else{
				zhufc.setF(zhufc.getF() + 1);
				kefc.setJf(kefc.getJf() + 3);
				kefc.setS(kefc.getS() + 1);
				footZjService.getMoney(bf.getQd1(), bf.getQd2(), 0, true, bf.getBflx(), request);
			}
		}
	}

	/**
	 * 删除报分后更新数据
	 *
	 * @param bf 报分实体
	 * @param request 请求
	 */
	@Override
	@SystemServiceLog(description = "删除报分后更新数据")
	public void deleteEncourage(FootBfinfo bf, HttpServletRequest request) {
		T zhufc = this.findByUserid(bf.getQd1());
		T kefc = this.findByUserid(bf.getQd2());
		processDelete(zhufc, kefc, bf, request);
		this.updateNotNull(zhufc, request);
		this.updateNotNull(kefc, request);
	}

	/**
	 * 处理报分后续功能减分
	 * @param zhufc 主场球队
	 * @param kefc 客场球队
	 * @param bf 报分实体
	 * @param request 请求
	 */
	@Override
	@SystemServiceLog(description = "处理报分后续功能减分")
	public void processDelete(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
		//俱乐部排行数据更新
		if(zhufc != null && kefc != null){
			zhufc.setBscc(zhufc.getBscc() - 1);
			kefc.setBscc(kefc.getBscc() - 1);

			if(bf.getJq1() > bf.getJq2()){
				//2代表主队胜利,1代表平,0代表主队负
				footZjService.getMoney(bf.getQd1(), bf.getQd2(), 2, false, bf.getBflx(), request);
				zhufc.setJf(zhufc.getJf() - 3);
				zhufc.setS(zhufc.getS() - 1);
				kefc.setF(kefc.getF() - 1);
			}else if(bf.getJq1().equals(bf.getJq2())){
				footZjService.getMoney(bf.getQd1(), bf.getQd2(), 1, false, bf.getBflx(), request);
				zhufc.setP(zhufc.getP() - 1);
				zhufc.setJf(zhufc.getJf() - 1);
				kefc.setJf(kefc.getJf() - 1);
				kefc.setP(kefc.getP() - 1);
			}else{
				footZjService.getMoney(bf.getQd1(), bf.getQd2(), 0, false, bf.getBflx(), request);
				zhufc.setF(zhufc.getF() - 1);
				kefc.setJf(kefc.getJf() - 3);
				kefc.setS(kefc.getS() - 1);
			}
		}
	}

}
